package com.collectionutils;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.primitives.Ints;
import org.junit.Test;

import java.util.List;

public class CollectionUtilsDemo {

    /**
     * 静态工厂方法
     */
    @Test
    public void staticMethodTest(){
        // 创建并初始化集合
        List<Integer> list = Lists.newArrayList(1, 2, 3);
        list.add(4);
        //指定初始化容器,会自动扩容,直接new一个list的话，默认大小是10,指定可节省内存
        List<Integer> capacityList = Lists.newArrayListWithCapacity(5);
        for (int i = 0; i < 10; i++) { capacityList.add(i); }
        //Guava引入的新集合类型直接提供了静态工厂方法
        HashMultiset.create();
        //工具类
        List<Integer> theList = Ints.asList(1, 2, 3, 4, 5);
        //反转
        Lists.reverse(theList); // {5, 4, 3, 2, 1}
        //分割集合
        List<List<Integer>> listList = Lists.partition(theList, 2);//{{1,2}, {3,4}, {5}}
        // 对集合中的元素操作,返回新集合
        Lists.transform(theList, x->x+1);
        //对集合元素求笛卡尔积,返回结果(最好是二维数组)
        List<List<Integer>> cartesianProduct = Lists.cartesianProduct(listList);
        cartesianProduct.forEach(x-> System.out.println(x));
        /** 分割集合求笛卡尔积结果
         * [1, 3, 5]
         * [1, 4, 5]
         * [2, 3, 5]
         * [2, 4, 5]
         */
    }

    /**
     *  Iterables,  iterable接口,可迭代,可使用foreach的集合必须实现此接口
     *              list,set,map等
     */
    @Test
    public void iterablesTest(){
        //串联多个Iterable,不可变
        Iterable<Integer> iterables = Iterables.concat(
                Ints.asList(1, 2, 2),
                Ints.asList(4, 5, 2));
        Iterables.getLast(iterables); //获取最后一个元素
        //返回对象在iterable中出现的次数
        Iterables.frequency(iterables, 2); //3
        //将iterables按指定大小分割成不可变集合
        Iterables.partition(iterables, 2);
        // 两个iterables元素全部相等返回true
        Iterables.elementsEqual(iterables,iterables);
        //限制iterable的元素个数限制给定值,如果原来的大于指定个数，则截取前几个
        Iterables.limit(iterables, 3);
        List<Integer> arrayList = Lists.newArrayList(9, 7);
        //将iterables元素添加到集合中
        Iterables.addAll(arrayList,iterables);
        arrayList.forEach(x-> System.out.print(x));//97122452
        Iterables.contains(iterables, 2); //是否包含某个元素
        //移除iterables中的元素,按照集合参数
        Iterable<Integer> integers = Lists.newArrayList(1, 2, 3, 4);
        Iterable<Integer> integers1 = Iterables.unmodifiableIterable(integers);
        integers1.forEach(x-> System.out.println(x)); //3,4
        // 获取不可变iterables
        Iterables.removeAll(integers, Lists.newArrayList(1,2));
        System.out.println(Iterables.get(integers, 0)); //根据索引获取值
        Iterables.find(integers, x -> x > 2); //根据前条件找元素,返回匹配的第一个,找不到报错
    }
}
